using Admin2025.Domain.Entities.App;
using Admin2025.Domain.Repositories;

namespace Admin2025.Application.Services;

/// <summary>
/// 角色服务类，提供角色相关的操作，如获取角色列表、创建角色、更新角色、删除角色以及权限分配等。
/// </summary>
public class RoleService
{
    private readonly IRepository<AppRole> _roleRep; // 角色仓库，用于与角色数据交互
    private readonly IRepository<AppPermission> _permissionRep; // 权限仓库，用于与权限数据交互

    /// <summary>
    /// 构造函数，注入角色仓库和权限仓库。
    /// </summary>
    /// <param name="roleRep">角色仓库</param>
    /// <param name="permissionRep">权限仓库</param>
    public RoleService(IRepository<AppRole> roleRep, IRepository<AppPermission> permissionRep)
    {
        _roleRep = roleRep;
        _permissionRep = permissionRep;
    }

    /// <summary>
    /// 获取所有角色。
    /// </summary>
    /// <returns>返回角色集合</returns>
    public async Task<IEnumerable<AppRole>> GetAllAsync()
    {
        return await _roleRep.GetAllAsync(); // 调用角色仓库的获取所有方法
    }

    /// <summary>
    /// 根据角色ID获取角色。
    /// </summary>
    /// <param name="id">角色ID</param>
    /// <returns>返回角色实体，如果角色不存在则返回null</returns>
    public async Task<AppRole?> GetByIdAsync(Guid id)
    {
        return await _roleRep.GetByIdAsync(id); // 调用角色仓库的根据ID获取方法
    }

    /// <summary>
    /// 创建新角色。
    /// </summary>
    /// <param name="role">要创建的角色实体</param>
    /// <returns>返回创建后的角色实体</returns>
    public async Task<AppRole> CreateAsync(AppRole role)
    {
        return await _roleRep.CreateAsync(role); // 调用角色仓库的创建方法
    }

    /// <summary>
    /// 更新角色信息。
    /// </summary>
    /// <param name="role">要更新的角色实体</param>
    public async Task UpdateAsync(AppRole role)
    {
        await _roleRep.UpdateAsync(role); // 调用角色仓库的更新方法
    }

    /// <summary>
    /// 根据角色ID删除角色。
    /// </summary>
    /// <param name="id">角色ID</param>
    public async Task DeleteAsync(Guid id)
    {
        var role = await _roleRep.GetByIdAsync(id); // 首先根据ID获取角色
        if (role == null) throw new Exception("角色不存在"); // 如果角色不存在，抛出异常
        await _roleRep.DeleteAsync(role); // 调用角色仓库的删除方法
    }

    /// <summary>
    /// 为角色分配权限。
    /// </summary>
    /// <param name="roleId">角色ID</param>
    /// <param name="permissionId">权限ID</param>
    public async Task AssignPermissionAsync(Guid roleId, Guid permissionId)
    {
        var role = await _roleRep.GetByIdAsync(roleId); // 根据角色ID获取角色
        var permission = await _permissionRep.GetByIdAsync(permissionId); // 根据权限ID获取权限
        if (role == null || permission == null) throw new Exception("角色或权限不存在"); // 如果角色或权限不存在，抛出异常
        role.AssignPermission(permission); // 调用角色实体的方法为角色分配权限
        await _roleRep.UpdateAsync(role); // 更新角色信息
    }

    /// <summary>
    /// 为角色移除权限。
    /// </summary>
    /// <param name="roleId">角色ID</param>
    /// <param name="permissionId">权限ID</param>
    public async Task RemovePermissionAsync(Guid roleId, Guid permissionId)
    {
        var role = await _roleRep.GetByIdAsync(roleId); // 根据角色ID获取角色
        var permission = await _permissionRep.GetByIdAsync(permissionId); // 根据权限ID获取权限
        if (role == null || permission == null) throw new Exception("角色或权限不存在"); // 如果角色或权限不存在，抛出异常
        role.RemovePermission(permission); // 调用角色实体的方法为角色移除权限
        await _roleRep.UpdateAsync(role); // 更新角色信息
    }
}